home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / x11 / video / xevil-1.000 / xevil-1 / actual.h < prev    next >
C/C++ Source or Header  |  1995-08-13  |  24KB  |  1,141 lines

  1. // "actual.h"
  2. // TAG: A
  3. // Actual objects to be instantiated.
  4.  
  5. /*    Copyright (C) 1994  Steve Hardt
  6.  
  7.     This program is free software; you can redistribute it and/or modify
  8.     it under the terms of the GNU General Public License as published by
  9.     the Free Software Foundation; either version 1, or (at your option)
  10.     any later version.
  11.  
  12.     This program is distributed in the hope that it will be useful,
  13.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.     GNU General Public License for more details.
  16.  
  17.     You should have received a copy of the GNU General Public License
  18.     along with this program; if not, write to the Free Software
  19.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20.  
  21.     Steve Hardt 
  22.     hardts@athena.mit.edu hardts@media.mit.edu
  23.     hardts@r4002.3dem.bioch.bcm.tmc.edu
  24.     2043 McClendon
  25.     Houston, TX 77030
  26. */
  27.  
  28. #ifndef ACTUAL_H
  29. #define ACTUAL_H
  30.  
  31. #ifndef NO_PRAGMAS
  32. #pragma interface
  33. #endif
  34.  
  35.  
  36. // Include Files
  37. #include "utils.h"
  38. #include "coord.h"
  39. #include "world.h"
  40. #include "locator.h"
  41. #include "physical.h"
  42.  
  43.  
  44.  
  45. enum {A_None,A_Explosion,A_Fire,
  46.       A_NProtection,A_TProtection,
  47.       A_Trapdoor,A_Home,
  48.       A_Shell,A_SwapShell,A_Lance,A_FrogShell,A_Fireball,A_Missile,A_Star,
  49.       A_Grenade,
  50.       A_Xit,A_Flag,
  51.       A_Rock,A_Weight,A_AltarOfSin,A_Doppel,
  52.       A_Transmogifier,A_MedKit,A_NShield,A_TShield,A_Bomb,
  53.       A_Chainsaw,A_Pistol,A_MGun,A_Lancer,A_FThrower,A_Launcher,A_Grenades,
  54.       A_Shotgun,A_Stars,
  55.       A_Swapper,A_FrogGun,
  56.       A_Enforcer,A_Frog,A_Hero,A_Ninja,A_Alien,A_ChopperBoy,A_Lemming,
  57.       A_FireDemon,
  58.       A_SuicideButton}; // SuicideButton is not an actual class.
  59.  
  60.  
  61.  
  62. // Class Declarations
  63. class Explosion: public Physical {
  64.  public:
  65.   Explosion(WorldP w,LocatorP l,const Pos &middle,const Id &bomber,int radius,
  66.         int damageMax);
  67.   
  68.   virtual Boolean collidable();
  69.   virtual const Area &get_area();
  70.   virtual const Area &get_area_next();
  71.   virtual void draw(Drawable buffer,Xvars &xvars,int,const Area &area);
  72.   virtual void act();
  73.  
  74.  
  75.  private:
  76.   const static PhysicalContext context;
  77.   Id bomber;
  78.   Area area; 
  79.   Pos middle; // Same as in area.
  80.   int radius;
  81.   int damageMax;
  82. };
  83.  
  84.  
  85.  
  86. class Fire: public Physical {
  87. public:
  88.   Fire(WorldP w,LocatorP l,const Pos &middle,Boolean coll = True);
  89.   /* NOTE: If coll is False, the Fire will not collide with anything.
  90.      I.e. Just for decoration. */
  91.   
  92.   static int get_damage();
  93.   virtual const Area &get_area();
  94.   virtual const Area &get_area_next();
  95.  
  96.   virtual Boolean collidable();
  97.  
  98.   virtual void draw(Drawable buffer,Xvars &xvars,int,const Area &area);
  99.  
  100.   virtual void avoid(PhysicalP other);
  101.   virtual void collide(PhysicalP other);
  102.   virtual void corporeal_attack(PhysicalP,int);
  103.   virtual void heat_attack(PhysicalP,int,Boolean);
  104.  
  105.   virtual void act();
  106.   virtual void update();
  107.  
  108.  
  109. private:
  110.   Boolean isCollidable;
  111.  
  112.   const static PhysicalContext context;
  113.   //  static PhysicalXdata xdata;
  114.   Area area,areaNext;
  115. };
  116.  
  117.  
  118.  
  119. // Protects from N_PROTECTION_N corporeal attacks.
  120. class NProtection: public Protection {
  121. public:
  122.   NProtection(WorldP,LocatorP,const Area &);
  123.  
  124.  
  125. private:
  126.   virtual Boolean corporeal_protect(int);
  127.   virtual Boolean heat_protect(int heat,Boolean);
  128.  
  129.   int n; // Number of hits that it can still take.
  130.   const static ProtectionContext context;
  131.   static ProtectionXdata xdata;
  132. };
  133.  
  134.  
  135.  
  136. // Protects from heat or corporeal attacks for T_PROTECTION_TIME turns.N
  137. class TProtection: public Protection {
  138. public:
  139.   TProtection(WorldP,LocatorP,const Area &);
  140.  
  141.   virtual void act();
  142.  
  143.  
  144. private:
  145.   virtual Boolean corporeal_protect(int);
  146.   virtual Boolean heat_protect(int heat,Boolean);
  147.  
  148.   Timer timer;
  149.   const static ProtectionContext context;
  150.   static ProtectionXdata xdata;
  151. };
  152.  
  153.  
  154.  
  155. class Rock: public Heavy {
  156.  public:
  157.   Rock(WorldP w,LocatorP l,const Pos &pos);
  158.   static Size get_size_max();
  159.  
  160.  
  161.  private:
  162.   const static HeavyContext context;
  163.   static HeavyXdata xdata;
  164. };
  165.  
  166.  
  167.  
  168. class Weight: public Heavy {
  169.  public:
  170.   Weight(WorldP w,LocatorP l,const Pos &pos);
  171.   static Size get_size_max();
  172.  
  173.  
  174.  private:
  175.   const static HeavyContext context;
  176.   static HeavyXdata xdata;
  177. };
  178.  
  179.  
  180.  
  181. class AltarOfSin: public Heavy {
  182.  public:
  183.   AltarOfSin(WorldP w,LocatorP l,const Pos &pos);
  184.   static Size get_size_max();
  185.  
  186.   virtual void corporeal_attack(PhysicalP,int); 
  187.  
  188.   virtual void heat_attack(PhysicalP,int,Boolean);
  189.  
  190.   virtual void collide(PhysicalP);
  191.  
  192.   virtual void update();
  193.  
  194.  
  195.  private:
  196.   Boolean turnTaken; // Only do one interesting thing per turn.
  197.  
  198.   const static HeavyContext context;
  199.   static HeavyXdata xdata;
  200. };
  201.  
  202.  
  203.  
  204. class Doppel: public Item {
  205.   // Not a AutoUse because Lemmings and other funny things get doppelganged.
  206.  public:
  207.   Doppel(WorldP,LocatorP,const Pos &);
  208.   static Size get_size_max();
  209.   
  210.   virtual void use(PhysicalP);
  211.   /* NOTE: Only certain classes may be used as doppelgangers.  If the
  212.      User is not of one of these classes, the doppelganger class will
  213.      be chosen randomly. */
  214.  
  215.   static const Stats &get_stats() {return stats;}
  216.  
  217.  
  218.  private:
  219.   PhysicalP create_physical(const Area &,ClassId);
  220.  
  221.   const static ItemContext context;
  222.   static ItemXdata xdata;
  223.   static Stats stats;
  224. };
  225.   
  226.  
  227.  
  228. class Transmogifier: public AutoUse {
  229.  public:
  230.   Transmogifier(WorldP,LocatorP,const Pos &);
  231.   static Size get_size_max();
  232.   
  233.   virtual void use(PhysicalP);
  234.  
  235.   static const Stats &get_stats() {return stats;}
  236.  
  237.  
  238.  private:
  239.   PhysicalP new_physical(const Pos &middle);
  240.   /* EFFECTS:  Create a new randomly chosen Physical centered at middle
  241.      for the object using the Transmogifier. */
  242.  
  243.   const static AutoUseContext context;
  244.   static AutoUseXdata xdata;
  245.   static Stats stats;
  246. };
  247.   
  248.  
  249.  
  250. class MedKit: public AutoUse {
  251.  public:
  252.   MedKit(WorldP w,LocatorP l,const Pos &pos);
  253.   static Size get_size_max();
  254.  
  255.   virtual void use(PhysicalP);
  256.  
  257.   static const Stats &get_stats() {return stats;}
  258.  
  259.  
  260.  private:
  261.   const static AutoUseContext context;
  262.   static AutoUseXdata xdata;
  263.   static Stats stats;
  264. };
  265.  
  266.  
  267.  
  268. class NShield: public Shield {
  269. public:
  270.   NShield(WorldP,LocatorP,const Pos &);
  271.   static Size get_size_max();
  272.  
  273.  
  274. private:
  275.   virtual ProtectionP create_protection(const Area &);
  276.  
  277.   const static ShieldContext context;
  278.   static ShieldXdata xdata;
  279. };
  280.  
  281.  
  282.  
  283. class TShield: public Shield {
  284. public:
  285.   TShield(WorldP,LocatorP,const Pos &);
  286.   static Size get_size_max();
  287.  
  288.  
  289. private:
  290.   virtual ProtectionP create_protection(const Area &);
  291.  
  292.   const static ShieldContext context;
  293.   static ShieldXdata xdata;
  294. };
  295.  
  296.  
  297.  
  298. class Bomb: public Animated {
  299.  public:
  300.   Bomb(WorldP w,LocatorP l,const Pos &pos);
  301.   static Size get_size_max();
  302.  
  303.   virtual void use(PhysicalP p);
  304.   /* NOTE: p can be NULL. */
  305.  
  306.   virtual void act();
  307.  
  308.   virtual Boolean is_bomb();
  309.  
  310.   virtual void set_quiet_death();
  311.  
  312.   virtual void die();
  313.   /* EFFECTS: Create an explosion. */
  314.  
  315.   static const Stats &get_stats() {return stats;}
  316.  
  317.  
  318.  private:
  319.   const static AnimatedContext context;
  320.   static AnimatedXdata xdata;
  321.   Timer timer;
  322.   Boolean active;
  323.   Id bomber; // Only valid if active.
  324.   Frame frame; 
  325.   Boolean defused;
  326.   static Stats stats;
  327. };
  328.  
  329.  
  330.  
  331. class Shell: public Shot {
  332.  public:
  333.   Shell(WorldP w,LocatorP l,const Pos &pos,const Id &shooter,
  334.     Dir dir);
  335.  
  336.   static Size get_size();
  337.  
  338.  
  339.  private:
  340.   const static ShotContext context;
  341.   static ShotXdata xdata;
  342. };
  343.  
  344.  
  345.  
  346. class SwapShell: public Shot {
  347.  public:
  348.   SwapShell(WorldP w,LocatorP l,const Pos &pos,
  349.         const Id &shooter,const Id& swapper,Dir dir);
  350.   /* NOTE: shooter is the person who fired it.  swapper is the swapper the 
  351.      shell came from. */
  352.  
  353.   virtual void collide(PhysicalP);
  354.   /* NOTE: Does not call up the tree. */
  355.  
  356.   static Size get_size();
  357.  
  358.  
  359.  private:
  360.   const static ShotContext context;
  361.   static ShotXdata xdata;
  362.   Id swapper;
  363. };
  364.  
  365.  
  366.  
  367. class Lance: public Shot {
  368.  public:
  369.   Lance(WorldP w,LocatorP l,const Pos &pos,const Id &shooter,
  370.     Dir dir);
  371.  
  372.   static Size get_size(Dir);
  373.  
  374.  
  375.  private:
  376.   static ShotXdata xdata;
  377.   const static ShotContext context;
  378. };
  379.  
  380.  
  381.  
  382. class FrogShell: public Shot {
  383.  public:
  384.   FrogShell(WorldP w,LocatorP l,const Pos &pos,const Id &shooter,
  385.         const Id &frogGun,Dir dir);
  386.  
  387.   static Size get_size();
  388.  
  389.   virtual void collide(PhysicalP);
  390.   /* NOTE: Does not call up the tree. */
  391.  
  392.  
  393.  private:
  394.   const static ShotContext context;
  395.   static ShotXdata xdata;
  396.   Id frogGun;
  397. };
  398.  
  399.  
  400.  
  401. class Fireball: public Shot {
  402.  public:
  403.   Fireball(WorldP w,LocatorP l,const Pos &pos,const Id &shooter,
  404.        Dir dir,int heat = -1,int time = -1);
  405.   /* NOTE: Will use heat and time instead of FIREBALL_HEAT and FIREBALL_TIME
  406.      if they are specified. */
  407.  
  408.   static Size get_size();
  409.  
  410.   virtual void draw(Drawable buffer,Xvars &xvars,int,const Area &area);
  411.   virtual void collide(PhysicalP other);
  412.   virtual void act();
  413.  
  414.  
  415.  private:
  416.   const static ShotContext context;
  417.   static ShotXdata xdata;
  418.   Timer timer;
  419.   int heat;
  420. };
  421.  
  422.  
  423.  
  424. // Only seeks after creatures.
  425. class Missile: public Shot {
  426.  public:
  427.   Missile(WorldP w,LocatorP l,const Pos &pos,const Id &shooter,Dir dir);
  428.  
  429.   static Size get_size(Dir);
  430.  
  431.   virtual void act();
  432.  
  433.  
  434.  private:
  435.   Boolean hasTarget;
  436.   Id targetId;
  437.   Timer timer;
  438.   Timer rotate;
  439.   Id shooterId;
  440.  
  441.   static ShotXdata xdata;
  442.   const static ShotContext context;
  443. };
  444.  
  445.  
  446.  
  447. class Star: public Shot {
  448.  public:
  449.   Star(WorldP w,LocatorP l,const Pos &pos,const Id &shooter,
  450.     Dir dir);
  451.  
  452.   static Size get_size();
  453.  
  454.  
  455.  private:
  456.   const static ShotContext context;
  457.   static ShotXdata xdata;
  458. };
  459.  
  460.  
  461.  
  462. class Trapdoor: public Moving {
  463. public:
  464.   enum {LEMMINGS_MAX = 40};
  465.  
  466.   Trapdoor(WorldP w,LocatorP l,const Pos &pos,const Id &homeId);
  467.  
  468.   virtual Boolean collidable();
  469.  
  470.   static Size get_size();
  471.  
  472.   virtual int get_drawing_level();
  473.   /* NOTE: Trapdoor drawn behind everything else. */
  474.  
  475.   int get_lemmings_out(IntelId *&lem) {lem = lemmings; return lemmingsNum;}
  476.   /* EFFECTS: Set lem to be an array of all the IntelIds of the lemmings that 
  477.      have been generated by this trapdoor,  i.e are "out".  Return the size of
  478.      the array. */
  479.  
  480.   virtual void act();
  481.  
  482.  
  483.  private:
  484.   Timer timer;
  485.   IntelId lemmings[LEMMINGS_MAX];
  486.   int lemmingsNum;
  487.   Id homeId; // Generated lemmings will seek this Home.
  488.   
  489.   const static MovingContext context;
  490.   static MovingXdata xdata;
  491. };
  492. typedef Trapdoor *TrapdoorP;
  493.  
  494.  
  495.  
  496. class Home: public Moving {
  497. public:
  498.   Home(WorldP w,LocatorP l,const Pos &pos);
  499.  
  500.   virtual Boolean collidable();
  501.  
  502.   static Size get_size();
  503.  
  504.   virtual int get_drawing_level();
  505.   /* NOTE: Home drawn behind everything else. */
  506.  
  507.   int get_lemmings_safe() {return lemmingsSafe;}
  508.  
  509.   virtual void act();
  510.  
  511.  
  512.  private:
  513.   int lemmingsSafe;
  514.   
  515.   const static MovingContext context;
  516.   static MovingXdata xdata;
  517. };
  518. typedef Home *HomeP;
  519.  
  520.  
  521.  
  522. class Grenade: public Falling {
  523. public:
  524.   Grenade(WorldP w,LocatorP l,const Pos &pos,const Id &sh,
  525.       Dir dir,Speed speed);
  526.   Grenade(WorldP,LocatorP,const Pos &,const Id &,const Vel &);
  527.  
  528.   static Size get_size(Dir dir);
  529.  
  530.   virtual void set_quiet_death();
  531.  
  532.   virtual void act();
  533.  
  534.   virtual void die();
  535.  
  536.   static const Stats &get_stats() {return stats;}
  537.  
  538.  
  539.  private:
  540.   Timer timer;
  541.   Id shooter;
  542.   Boolean defused;
  543.  
  544.   const static FallingContext context;
  545.   static FallingXdata xdata;
  546.   static Stats stats;
  547. };
  548.  
  549.  
  550.  
  551. // NOTE: Called Xit instead of Exit to avoid naming conflicts.
  552. class Xit: public Touchable {
  553. public:
  554.   Xit(WorldP w,LocatorP l,const Pos &pos);
  555.   static Size get_size_max();
  556.  
  557.   
  558.  private:
  559.   const static TouchableContext context;
  560.   static TouchableXdata xdata;
  561. };
  562.  
  563.  
  564.  
  565. class Flag: public Touchable {
  566. public:
  567.   Flag(WorldP w,LocatorP l,const Pos &pos);
  568.   static Size get_size_max();
  569.  
  570.   
  571.  private:
  572.   const static TouchableContext context;
  573.   static TouchableXdata xdata;
  574. };
  575.  
  576.  
  577.  
  578. class Chainsaw: public Cutter {
  579.  public:
  580.   Chainsaw(WorldP w,LocatorP l,const Pos &pos);
  581.   static Size get_size_max();
  582.  
  583.  
  584.  private:
  585.   const static CutterContext context;
  586.   static CutterXdata xdata;
  587. };
  588.  
  589.  
  590.  
  591. //////////// Gun
  592. // Parent: Weapon
  593. // Shoots shells.  Has timer between allowed shots.
  594. struct GunContext {
  595.   int shotTime;
  596.   int ammoInitial;
  597.   int ammoMax;  
  598.   WeaponContext weaponContext;
  599. };
  600. typedef WeaponXdata GunXdata;
  601.  
  602.  
  603. class Gun: public Weapon {
  604. public:
  605.   Gun(const GunContext &,GunXdata &,WorldP,LocatorP,const Pos &);
  606.  
  607.   virtual Boolean is_gun();
  608.   virtual Boolean ready();
  609.   int get_ammo();
  610.   int get_ammo_max();
  611.  
  612.   virtual void update();
  613.  
  614.  
  615. #ifndef PROTECTED_IS_PUBLIC
  616. protected:
  617. #endif
  618.   void set_ammo(int);
  619.   void set_shot_timer() {timer.set();}
  620.  
  621.   virtual Size get_shot_size(Dir);
  622.  
  623.   virtual Dir compute_weapon_dir(ITcommand);
  624.   /* EFFECTS:  Returns the direction the weapon should be fired using c, or
  625.      CO_air if there is none. */
  626.  
  627.   virtual void fire(const Id &id,ITcommand command);
  628.   void _fire(const Id &id,Dir dir,Boolean setTimer = True,
  629.          Boolean costsAmmo = True);
  630.   /* NOTE: Only the first of these two functions should be overridden. */
  631.   /* EFFECTS: Gun is fired by the shooter id with ITcommand command or in Dir
  632.      dir.  setTimer says whether or not to force a delay between shots. 
  633.      costsAmmo says whether a unit of ammo is subtracted for the shot.*/
  634.   
  635.   virtual PhysicalP create_shot(PhysicalP shooter,WorldP world,
  636.                 LocatorP locator,const Pos &pos,Dir dir);
  637.   /* EFFECTS: Create the object to be fired out of the gun.  E.g. shell, 
  638.      swap_shell. shooter is the object firing the gun. */
  639.  
  640.  
  641. private:
  642.   Timer timer;
  643.   int ammo;
  644.   const GunContext *gc;
  645. };
  646.  
  647.  
  648.  
  649. class Pistol: public Gun {
  650.  public:
  651.   Pistol(WorldP w,LocatorP l,const Pos &pos);
  652.   static Size get_size_max();
  653.  
  654.  
  655.  private:
  656.   const static GunContext context;
  657.   static GunXdata xdata;
  658. };
  659.  
  660.  
  661.  
  662. class MGun: public Gun {
  663.  public:
  664.   MGun(WorldP w,LocatorP l,const Pos &pos);
  665.   static Size get_size_max();
  666.  
  667.  
  668.  private:
  669.   const static GunContext context;
  670.   static GunXdata xdata;
  671. };
  672.  
  673.  
  674.  
  675. class Lancer: public Gun {
  676.  public:
  677.   Lancer(WorldP w,LocatorP l,const Pos &pos);
  678.   static Size get_size_max();
  679.  
  680.  
  681.  private:
  682.   virtual Size get_shot_size(Dir);
  683.   virtual Dir compute_weapon_dir(ITcommand);
  684.   virtual PhysicalP create_shot(PhysicalP,WorldP,LocatorP,const Pos &,Dir dir);
  685.  
  686.   const static GunContext context;
  687.   static GunXdata xdata;
  688. };
  689.  
  690.  
  691.  
  692. class FThrower: public Gun {
  693.  public:
  694.   FThrower(WorldP w,LocatorP l,const Pos &pos);
  695.   static Size get_size_max();
  696.  
  697.   virtual PhysicalP create_shot(PhysicalP,WorldP,LocatorP,const Pos &,Dir dir);
  698.  
  699.   virtual void fire(const Id &,ITcommand);
  700.  
  701.   virtual void act();
  702.   
  703.  
  704.  private:
  705.   virtual Size get_shot_size(Dir);
  706.  
  707.   Timer stopFiring;
  708.   Id killerId; // Valid iff isFiring.
  709.   ITcommand fireCommand;   // Valid iff isFiring.
  710.   Boolean isFiring;
  711.  
  712.   const static GunContext context;
  713.   static GunXdata xdata;
  714. };
  715.  
  716.  
  717.  
  718. class Launcher: public Gun {
  719.  public:
  720.   Launcher(WorldP w,LocatorP l,const Pos &pos);
  721.   static Size get_size_max();
  722.  
  723.  
  724. private:
  725.   virtual Size get_shot_size(Dir);
  726.   virtual PhysicalP create_shot(PhysicalP,WorldP,LocatorP,const Pos &,Dir dir);
  727.  
  728.   const static GunContext context;
  729.   static GunXdata xdata;
  730. };
  731.  
  732.  
  733.  
  734. class Grenades: public Gun {
  735.  public:
  736.   Grenades(WorldP w,LocatorP l,const Pos &pos);
  737.   static Size get_size_max();
  738.  
  739.  
  740. private:
  741.   virtual Size get_shot_size(Dir);
  742.   virtual PhysicalP create_shot(PhysicalP,WorldP,LocatorP,const Pos &,Dir dir);
  743.  
  744.   const static GunContext context;
  745.   static GunXdata xdata;
  746. };
  747.  
  748.  
  749.  
  750. class Shotgun: public Gun {
  751.  public:
  752.   Shotgun(WorldP w,LocatorP l,const Pos &pos);
  753.   static Size get_size_max();
  754.  
  755.   void fire(const Id &,ITcommand);
  756.  
  757.  
  758.  private:
  759.   const static GunContext context;
  760.   static GunXdata xdata;
  761. };
  762.  
  763.  
  764.  
  765. class Stars: public Gun {
  766.  public:
  767.   Stars(WorldP w,LocatorP l,const Pos &pos);
  768.   static Size get_size_max();
  769.  
  770.  
  771.  private:
  772.   virtual Size get_shot_size(Dir);
  773.   virtual PhysicalP create_shot(PhysicalP,WorldP,LocatorP,const Pos &,Dir dir);
  774.   
  775.   virtual void fire(const Id &id,ITcommand command);
  776.  
  777.   const static GunContext context;
  778.   static GunXdata xdata;
  779. };
  780.  
  781.  
  782.  
  783. //////////// SingleGun
  784. // Parent: Gun
  785. struct SingleGunContext {
  786.   GunContext gunContext;
  787. };
  788. typedef GunXdata SingleGunXdata;
  789.  
  790.  
  791. class SingleGun: public Gun {
  792. public:
  793.   SingleGun(const SingleGunContext &,SingleGunXdata &,
  794.         WorldP,LocatorP,const Pos &);
  795.  
  796.   virtual Boolean ready();
  797.   
  798.  
  799. private:
  800.   virtual void fire(const Id &id,ITcommand command);
  801.   
  802.   Id shotId;
  803. };
  804.  
  805.  
  806.  
  807. class Swapper: public SingleGun {
  808.  public:
  809.   Swapper(WorldP w,LocatorP l,const Pos &pos);
  810.   static Size get_size_max();
  811.  
  812.  
  813. private:
  814.   virtual Size get_shot_size(Dir);
  815.   virtual PhysicalP create_shot(PhysicalP,WorldP,LocatorP,const Pos &,Dir dir);
  816.  
  817.   const static SingleGunContext context;
  818.   static SingleGunXdata xdata;
  819. };
  820.  
  821.  
  822.  
  823. class FrogGun: public SingleGun {
  824.  public:
  825.   FrogGun(WorldP w,LocatorP l,const Pos &pos);
  826.   static Size get_size_max();
  827.  
  828.  
  829. private:
  830.   virtual Size get_shot_size(Dir);
  831.   virtual PhysicalP create_shot(PhysicalP,WorldP,LocatorP,const Pos &,Dir dir);
  832.  
  833.   const static SingleGunContext context;
  834.   static SingleGunXdata xdata;
  835. };
  836.  
  837.  
  838.  
  839. class Enforcer: public virtual Creature, public Grounded, public Suicide {
  840.  public:
  841.   Enforcer(WorldP w,LocatorP l,const Pos &pos);
  842.   static Size get_size_max();
  843.  
  844.   virtual Boolean is_suicide();
  845.  
  846.   virtual Boolean prickly();
  847.  
  848.   virtual void collide(PhysicalP p);
  849.  
  850.   virtual void act();
  851.  
  852.   static const Stats &get_stats() {return stats;}
  853.  
  854.   virtual void die();
  855.  
  856.  
  857.  private:
  858.   const static CreatureContext creatureContext;
  859.   const static GroundedContext groundedContext;
  860.   const static SuicideContext suicideContext;
  861.   static CreatureXdata creatureXdata;
  862.   static GroundedXdata groundedXdata;
  863.   static SuicideXdata suicideXdata;
  864.   static Stats stats;
  865. };
  866.  
  867.  
  868.  
  869. class Frog: public virtual Creature, public Hopping {
  870.  public:
  871.   Frog(WorldP w,LocatorP l,const Pos &pos,const Id &unmapped);
  872.   /* NOTE: Can create a frog with no unmapped by giving an invalid Id. */
  873.  
  874.   static Size get_size_max();
  875.  
  876.   virtual void act();
  877.  
  878.   virtual void die();
  879.   /* EFFECTS: If unmapped exists, have it die where the frog is. 
  880.      Otherwise, let Creature leave a dead frog. */
  881.  
  882.   static const Stats &get_stats() {return stats;}
  883.  
  884.  
  885.  private:
  886.   const static CreatureContext creatureContext;
  887.   const static HoppingContext hoppingContext;
  888.   static CreatureXdata creatureXdata;
  889.   static HoppingXdata hoppingXdata;
  890.  
  891.   Boolean unmappedSet;
  892.   Id unmapped;
  893.   Timer timer; // Only meaningful if unmappedSet.
  894.   static Stats stats;
  895. };
  896.  
  897.  
  898.  
  899. class Hero: public virtual Creature, public Walking, public Fighter, 
  900. public User 
  901. {
  902.  public:
  903.   Hero(WorldP w,LocatorP l,const Pos &pos);
  904.   static Size get_size_max();
  905.  
  906.   virtual Boolean is_fighter();
  907.   virtual Boolean is_walking();
  908.   virtual Boolean is_user();
  909.  
  910.   virtual void get_pixmap_mask(int dpyNum,Pixmap &,Pixmap &,Dir,int);
  911.   virtual void get_size_offset_next(Size &size,Size &offset,Dir dirNext);
  912.  
  913.   virtual int get_weapons_num();
  914.   virtual int get_items_num(); 
  915.   virtual PhysicalP get_weapon(int);
  916.   virtual PhysicalP get_item(int); 
  917.   virtual PhysicalP get_weapon_current();
  918.   virtual PhysicalP get_item_current();
  919.   virtual void set_mapped_next(Boolean val);
  920.  
  921.   virtual void heal();
  922.   
  923.   virtual void act();
  924.  
  925.   virtual void update();
  926.   
  927.   virtual void die();
  928.  
  929.   virtual void collide(PhysicalP other);
  930.  
  931.   static const Stats &get_stats() {return stats;}
  932.   
  933.  
  934. private:
  935.   Timer healTimer;
  936.   Health healthMin;
  937.  
  938.   virtual void init_x(Xvars &);
  939.  
  940.   static CreatureXdata creatureXdata;
  941.   static WalkingXdata walkingXdata;
  942.   static FighterXdata fighterXdata;
  943.   static UserXdata userXdata;
  944.  
  945.   const static CreatureContext creatureContext;
  946.   const static WalkingContext walkingContext;
  947.   const static FighterContext fighterContext;
  948.   const static UserContext userContext;
  949.   static Stats stats;
  950. };
  951.  
  952.  
  953.  
  954. class Ninja: public virtual Creature, public Sticky, public Fighter, public User {
  955.  public:
  956.   Ninja(WorldP w,LocatorP l,const Pos &pos);
  957.   static Size get_size_max();
  958.   
  959.   virtual Boolean is_fighter();
  960.   virtual Boolean is_sticky();
  961.   virtual Boolean is_user();
  962.  
  963.   virtual void get_pixmap_mask(int dpyNum,Pixmap &,Pixmap &,Dir,int);
  964.   virtual void get_size_offset_next(Size &size,Size &offset,Dir dirNext);
  965.  
  966.   virtual int get_weapons_num();
  967.   virtual int get_items_num(); 
  968.   virtual PhysicalP get_weapon(int);
  969.   virtual PhysicalP get_item(int); 
  970.   virtual PhysicalP get_weapon_current();
  971.   virtual PhysicalP get_item_current();
  972.   virtual void set_mapped_next(Boolean val);
  973.   
  974.   virtual void act();
  975.  
  976.   virtual void update();
  977.   
  978.   virtual void die();
  979.  
  980.   virtual void collide(PhysicalP other);
  981.   
  982.   static const Stats &get_stats() {return stats;}
  983.  
  984.   
  985. private:
  986.   virtual void init_x(Xvars &);
  987.  
  988.   static CreatureXdata creatureXdata;
  989.   static StickyXdata stickyXdata;
  990.   static FighterXdata fighterXdata;
  991.   static UserXdata userXdata;
  992.   
  993.   const static CreatureContext creatureContext;
  994.   const static StickyContext stickyContext;
  995.   const static FighterContext fighterContext;
  996.   const static UserContext userContext;
  997.   static Stats stats;
  998. };
  999.  
  1000.  
  1001.  
  1002. class Alien: public virtual Creature, public Sticky {
  1003.  public:
  1004.   Alien(WorldP w,LocatorP l,const Pos &pos);
  1005.   static Size get_size_max();
  1006.  
  1007.   virtual Boolean is_sticky();
  1008.  
  1009.   virtual Boolean prickly();
  1010.  
  1011.   virtual void collide(PhysicalP p);
  1012.  
  1013.   virtual void act();
  1014.  
  1015.   virtual void die();
  1016.  
  1017.   static const Stats &get_stats() {return stats;}
  1018.  
  1019.  
  1020.  private:
  1021.   const static CreatureContext creatureContext;
  1022.   const static StickyContext stickyContext;
  1023.   static CreatureXdata creatureXdata;
  1024.   static StickyXdata stickyXdata;
  1025.   static Stats stats;
  1026. };
  1027.  
  1028.  
  1029.  
  1030. class ChopperBoy: public virtual Creature, public Flying, public User {
  1031.  public:
  1032.   ChopperBoy(WorldP w,LocatorP l,const Pos &pos);
  1033.   static Size get_size_max();
  1034.   
  1035.   virtual Boolean is_flying();
  1036.  
  1037.   virtual Boolean is_user();
  1038.   virtual int get_weapons_num();
  1039.   virtual int get_items_num(); 
  1040.   virtual PhysicalP get_weapon(int);
  1041.   virtual PhysicalP get_item(int); 
  1042.   virtual PhysicalP get_weapon_current();
  1043.   virtual PhysicalP get_item_current();
  1044.   virtual void set_mapped_next(Boolean val);
  1045.   
  1046.   virtual void act();
  1047.  
  1048.   virtual void update();
  1049.   
  1050.   virtual void die();
  1051.  
  1052.   virtual void collide(PhysicalP other);
  1053.  
  1054.   static const Stats &get_stats() {return stats;}
  1055.   
  1056.   
  1057.  private:
  1058.   static CreatureXdata creatureXdata;
  1059.   static FlyingXdata flyingXdata;
  1060.   static UserXdata userXdata;
  1061.   
  1062.   const static CreatureContext creatureContext;
  1063.   const static FlyingContext flyingContext;
  1064.   const static UserContext userContext;
  1065.   static Stats stats;
  1066. };
  1067.  
  1068.  
  1069.  
  1070. class Lemming: public virtual Creature, public Grounded, public Suicide {
  1071.  public:
  1072.   Lemming(WorldP w,LocatorP l,const Pos &pos);
  1073.   static Size get_size_max();
  1074.  
  1075.   virtual Boolean is_suicide();
  1076.  
  1077.   virtual void act();
  1078.  
  1079.   static const Stats &get_stats() {return stats;}
  1080.  
  1081.   virtual void die();
  1082.  
  1083.  
  1084.  private:
  1085.   const static CreatureContext creatureContext;
  1086.   const static GroundedContext groundedContext;
  1087.   const static SuicideContext suicideContext;
  1088.   static CreatureXdata creatureXdata;
  1089.   static GroundedXdata groundedXdata;
  1090.   static SuicideXdata suicideXdata;
  1091.   static Stats stats;
  1092. };
  1093.  
  1094.  
  1095.  
  1096. class FireDemon: public virtual Creature, public Flying, public BuiltIn {
  1097.  public:
  1098.   FireDemon(WorldP w,LocatorP l,const Pos &pos);
  1099.   static Size get_size_max();
  1100.   
  1101.   virtual Boolean is_flying();
  1102.  
  1103.   virtual Boolean is_built_in();
  1104.  
  1105.   virtual Boolean ready();
  1106.  
  1107.   virtual void heat_attack(PhysicalP,int heat,Boolean secondary = False);
  1108.  
  1109.   virtual Boolean swap_protect();
  1110.  
  1111.   virtual Boolean frog_protect();
  1112.  
  1113.   virtual void act();
  1114.  
  1115.   virtual void collide(PhysicalP other);
  1116.   
  1117.   
  1118. #ifndef PROTECTED_IS_PUBLIC
  1119.  protected:
  1120. #endif
  1121.   virtual Size get_shot_size(Dir);
  1122.  
  1123.   virtual PhysicalP create_shot(const Pos &,Dir);
  1124.  
  1125.  
  1126.  private:
  1127.   int swapResistance;
  1128.   
  1129.   static CreatureXdata creatureXdata;
  1130.   static FlyingXdata flyingXdata;
  1131.   static BuiltInXdata builtInXdata;
  1132.   
  1133.   const static CreatureContext creatureContext;
  1134.   const static FlyingContext flyingContext;
  1135.   const static BuiltInContext builtInContext;
  1136. };
  1137. #endif
  1138.  
  1139.  
  1140.  
  1141.